/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mp3java;
import java.util.*;



/*
L'esercizio di oggi consiste nella realizzazione in Java
della solita classe Lettore per la gestione di file musicali

Nota: per svolgere questo esercizio vi puo' essere utile vedere il file

http://people.unipmn.it/manzini/oop/sorgenti/Frazione.java

che contiene il codice della classe Frazione sia in Java che in Ruby.

*/


/* Un brano musicale e' rappresentato dalla seguente classe. */

class Brano {
    // variabili di istanza
    String autore;
    String titolo;
    int dimensione;
    int gradimento;

    // costruttore
    Brano(String a, String t, int d, int g) {
        autore = a;
        titolo = t;
        dimensione = d;
        gradimento = g;
    }

    // restituisce una rappresentazione di this come stringa
    public String toString() {
        String s = "A:" + autore;
        s += " T:" + titolo;
        s += " D:" + dimensione;
        return s  + " G:" + gradimento;
    }

    public boolean equals(Brano o){
        if (o instanceof Brano){
        return o.titolo.equals(titolo) && o.autore.equals(autore);
        }
        return false;
    }
}



/*

Un lettore mp3 e' caratterizzato da:

  1) la capacita' massima del lettore (in Kb)
  2) lo spazio attualmente disponibile (in Kb)
  3) il numero massimo di brani che puo' essere contenuto
  4) l'elenco dei brani attualmente contenuti nel lettore

(poniamo un massimo al numero dei brani in modo da poterli memorizzare in un
array di Java che, a differenza degli array di Ruby, non puo' cambiare
dimensione dopo che e' stato creato)

La classe Lettore avra' quindi il seguente costruttore:

*/

class Lettore {
    // veriabili di istanza
    int memoriaIniziale;  // memora iniziale del lettore
    int memoria;          // memoria attualmente libera
    Brano[] elencoBrani;  // array di Brani
    int dimElenco;        // numero massimo di Brani in elencoBrani
    int numBrani;          // numero Brani attualmente in elencoBrani

    // costruttore: il primo parametro e' la capacita' iniziale del lettore,
    // il secondo il numero di brani che possono essere inseriti
    Lettore(int capac_iniziale, int max_brani) {
        memoriaIniziale = capac_iniziale;
        memoria = memoriaIniziale;
        dimElenco = max_brani;
        elencoBrani = new Brano[dimElenco];  // alloco array di brani
        numBrani=0;
    }




// Aggiungere alla classe Lettore i seguenti metodi:

boolean inserisciBrano(Brano b){
    int i;
    for (i=0;i<numBrani;++i){
        if (elencoBrani[i].equals(b)){
            return false;
        }}
    if (memoria-b.dimensione>=0){
       elencoBrani[numBrani]=b;
       numBrani ++;
       memoria-=b.dimensione;
       return true;
    }
    return false;
}
        

// inserisce il brano b nel lettore, ma solo se lo stesso brano non e' gia'
// presente e se c'e' sufficiente spazio nel lettore.
// Due brani sono considerati lo stesso brano se hanno
// il medesimo autore e il medesimo titolo.
// Restituisce true se il brano viene inserito, false altrimenti

boolean cancellaBrano(Brano b){
    int i;
    boolean ris=false;
    for (i=0;i<numBrani;++i){
       if (elencoBrani[i].equals(b)){
           elencoBrani[i]=elencoBrani[i+1];
           memoria+=b.dimensione;
           numBrani--;
           ris=true;
        }
            if (ris==true)
              elencoBrani[i]=elencoBrani[i+1];
        }
    return ris;
}
// cancella il brano b. Restituisce true se la cancellazione viene
// effettuata, false altrimenti (cioe' la cancellazione non puo'
// essere effettuata perche' il brano non e' nel lettore)

int cambiaGradimento(String aut, int delta){
    int i;
    int ris=0;
   for (i=0;i<numBrani;++i){
       if (elencoBrani[i].autore.equals(aut)){
           ris++;
           elencoBrani[i].gradimento+=delta;
       }
    }
       return ris;
}
// incrementa il gradimento di tutti brani che hanno come autore aut
// della quantita' delta. Restituisce il numero di brani il cui
// gradimento e' stato cambiato

public String toString(){
    int i;
    String s="";
    for (i=0;i<numBrani;++i){
        s += "A:" + elencoBrani[i].autore;
        s += " T:" + elencoBrani[i].titolo;
        s += " D:" + elencoBrani[i].dimensione;
        s  += " G:" + elencoBrani[i].gradimento +"\n";

        }
   return s + "memoria disponibile:" + memoria;

}
// restituisce una stringa contenente l'elenco dei brani contenuti nel
// lettore (separati da \n) e la quantita' di memoria disponibile.
// per rappresentare il brano b si usi b.toString()

int gradimentoTot(){
    int i;
    int ris=0;
    for (i=0;i<numBrani;++i){
        ris+=elencoBrani[i].gradimento;
        }
           return ris;
}

// restituisce la somma dei gradimenti dei brani contenuti nel lettore

/*
Per testare il vostro programma potete usare il metodo main()
definito qui sotto (deve essere messo all'interno della classe Lettore).
*/
}
public class Main{
    public static void main(String arg[]) {
      boolean risultato;

      // crea un sistema con ~ 4 Gb disponibili e al max 100 brani
      Lettore ipod = new Lettore(4000000,100);

      // inserimenti
      risultato = ipod.inserisciBrano(new Brano("Beatles", "Yesterday", 3600, 10));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Mina", "Yesterday", 3650, 8));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Beatles", "Yesterday", 3600, 10));
      System.out.println(risultato); //false
      System.out.println(ipod.gradimentoTot()); // 18
      risultato = ipod.inserisciBrano(new Brano("U2", "Gone", 4000, 12));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("U2", "Please", 4500, 13));
      System.out.println(risultato); //true
      System.out.println(ipod);
      // A:Beatles T:Yesterday D:3600 G:10
      // A:Mina T:Yesterday D:3650 G:8
      // A:U2 T:Gone D:4000 G:12
      // A:U2 T:Please D:4500 G:13
      // Spazio disponibile: 3984250

      // inserimenti brani grandi
      risultato = ipod.inserisciBrano(new Brano("Mozart", "Don Giovanni", 3990000, 33));
      System.out.println(risultato); //false
      System.out.println(ipod.gradimentoTot()); // 43
      risultato = ipod.inserisciBrano(new Brano("Mozart", "Flauto Magico", 12000, 20));
      System.out.println(risultato); //true

      // cancellazioni
      risultato = ipod.cancellaBrano(new Brano("Beatles", "Yesterday", 3600, 10));
      System.out.println(risultato); //true
      risultato = ipod.cancellaBrano(new Brano("Beatles", "Tomorrow", 3600, 10));
      System.out.println(risultato); //false
      System.out.println(ipod);
      //A:Mozart T:Flauto Magico D:12000 G:20
      //A:Mina T:Yesterday D:3650 G:8
      //A:U2 T:Gone D:4000 G:12
      //A:U2 T:Please D:4500 G:13
      //Spazio disponibile: 3975850

      // altri inserimenti
      risultato = ipod.inserisciBrano(new Brano("Beatles", "Let it be", 4800, 11));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Modugno", "Volare", 4000, 25));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Mina", "E penso a te", 4500, 13));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Battisti", "Viaggiare", 4300, 7));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Battisti", "Ancora tu", 3600, 14));
      System.out.println(risultato); //true
      risultato = ipod.inserisciBrano(new Brano("Battisti", "Pensieri e parole", 3400, 15));
      System.out.println(risultato); //true
      System.out.println(ipod);
      //A:Mozart T:Flauto Magico D:12000 G:20
      //A:Mina T:Yesterday D:3650 G:8
      //A:U2 T:Gone D:4000 G:12
      //A:U2 T:Please D:4500 G:13
      //A:Beatles T:Let it be D:4800 G:11
      //A:Modugno T:Volare D:4000 G:25
      //A:Mina T:E penso a te D:4500 G:13
      //A:Battisti T:Viaggiare D:4300 G:7
      //A:Battisti T:Ancora tu D:3600 G:14
      //A:Battisti T:Pensieri e parole D:3400 G:15
      //Spazio disponibile: 3951250

      System.out.println(ipod.gradimentoTot()); // 138
      System.out.println(ipod.cambiaGradimento("Battisti",2)); // 3
      System.out.println(ipod.cambiaGradimento("Gaber",2));    // 0
      System.out.println(ipod.gradimentoTot()); // 144

      System.out.println("----- FINE -----");

    }

}



